#include <iostream>
#include <pthread.h>
#include <string>
#include <cstring>
#include <unistd.h>

std::string toHex(pthread_t tid)
{
    // 进程内的函数在栈上，线程共享
    char buffer[64];
    snprintf(buffer, sizeof(buffer), "0x%lx", tid);
    return buffer;
}
class ThreadData
{
public:
    ThreadData() // 不用构造函数直接初始化 用下面自己init的初始化
    {
    }
    void Init(const std::string &name, int a, int b)
    {
        _name = name, _a = a, _b = b;
    }
    void Excute()
    {
        _result = _a + _b;
    }
    int Result() { return _result; }
    std::string Name()
    {
        return _name;
    }
    void SetTid(pthread_t tid)
    {
        _tid = tid;
    }
    pthread_t TId() { return _tid; }
    int A() { return _a; } // 获取_a的值 下面直接调用A()即可 .A()
    int B() { return _b; }
    ~ThreadData()
    {
    }

private:
    std::string _name;
    int _a;
    int _b;
    int _result;
    pthread_t _tid;
};

#define NUM 10
int argv = 0;
void *routine(void *args)
{
    ThreadData *td = static_cast<ThreadData *>(args);
    while (true)
    {
        std::cout << "我是新线程，我的名字是: " << td->Name() << ", my tid is: " << toHex(pthread_self()) << ",全局变量(只是检测argv): " << argv << std::endl;
        td->Excute();
        sleep(2);
        break;
    }
    return td;
}

int main()
{
    ThreadData td[NUM];
    // 准备我们要加工处理的数据
    for (int i = 0; i < NUM; i++)
    {
        char id[64];
        snprintf(id, sizeof(id), "thread-%d", i);
        td[i].Init(id, i * 10, i * 20);
    }

    // 创建多线程
    for (int i = 0; i < NUM; i++)
    {
        pthread_t id;
        pthread_create(&id, nullptr, routine, &td[i]); // 十个任务十个线程 一人一个任务 把一个数组分时成一小块一小块
        td[i].SetTid(id);                              // 把刚刚获取的id设置进来
    }

    // 等待多线程
    for (int i = 0; i < NUM; i++)
    {
        pthread_join(td[i].TId(), nullptr); // 如果拿出来就是上面传进去的数组td[NUM]的地址
        printf("td[%d]: %d+%d=%d[%ld]\n", i, td[i].A(), td[i].B(), td[i].Result(), toHex(td[i].TId()));
    }

    // A *a;
    // pthread_t tid;
    // int n = pthread_create(&tid, nullptr, routine, a);
    // int n = pthread_create(&tid, nullptr, routine, (void *)"hello");
    // std::cout << "tid:" << tid << std::endl;

    // if (n != 0)
    // {
    //     std::cout << "pthread_create filled" << strerror(n) << std::endl;
    //     return -1;
    // }

    // while (1)
    // {
    //     std::cout << "我是主线程,我的pid是: " << tid << std::endl;
    //     sleep(1);
    // }

    return 0;
}
